#include "Sesion.h"
#include "tcp.h"
#include "log.h"

Sesion::Sesion(){ //:conversacionesActuales(FTOK_PATH,LISTA_COMPARTIDA_CONVERSACIONES){
    //TODO: conversacionesActuales NO SE ESTA USANDO EN NINGUN LADO
    control = NULL;
}

bool Sesion::iniciar(long idUsuario, const char* host){
    this->idUsuario = idUsuario;
    control = new ControlRPCCliente(host);
    //Abro canal de control con el controlador central
    if(!control->iniciarSesion(idUsuario))
	return false;
    return abrirConexionDeControl(host);
}

void Sesion::cerrar(){
    control->cerrarSesion(idUsuario);
}

std::vector<long> Sesion::listarTodasLasConversaciones(){
    std::vector<long> conversaciones;
    lista l;
    l = control->obtenerListaConversaciones();
    int i=0;
    for (i=0; l.lista_val[i] != 0; ++i)	{
	conversaciones.push_back(l.lista_val[i]);
    }

    return conversaciones;
}

long Sesion::crearConversacion(){
    return control->unirseAConversacion(idUsuario, 0);
}

bool Sesion::unirseAConversacion(long idConversacion){
    //Borro la lista de participantes
    ListaCompartida<long> participantes(FTOK_PATH, LISTA_COMPARTIDA_CONVERSACION_BASE+idConversacion);
    participantes.clear();
    return control->unirseAConversacion(idUsuario, idConversacion);
}

Conversacion Sesion::getConversacion(long idConversacion){
    Conversacion c(idUsuario, idConversacion);
    return c;
}

void Sesion::cerrarConversacion(long idConversacion){
    control->abandonarConversacion(idUsuario, idConversacion);
}

Sesion::~Sesion(){
    if(control)
	delete control;
}

void Sesion::recuperar(long idUsuario){
    this->idUsuario = idUsuario;
}

bool Sesion::abrirConexionDeControl(const char* host){

    int sockfd = tcpopact(host, PORT_FIJO);
    
    if(sockfd <= 0){
    	perror("No se pudo conectar con el notificador remoto.");
    	return false;
    }

    if(fork() == 0){
	static char socket[20];
	char usuario[20];
	sprintf(socket, "%d", sockfd);
	sprintf(usuario, "%ld", idUsuario);
	execlp("./controlador", "controlador", usuario, socket, NULL);
	perror("Error al lanzar el proceso controlador.");
	exit(-1);
    }
    close(sockfd);
    return true;
}
